Hi again. Here are the details i've worked on so far:
/**
* @hibernate.class table="activity"
*/
public class Activity extends PersistentObject {
private String name;
private Float mondayHours;
private Float tuesdayHours;
private Float wednesdayHours;
private Float thursdayHours;
private Float fridayHours;
private Float saturdayHours;
private Float sundayHours;
/**
* @hibernate.id column="id" generator-class="native"
*/
public String getId() {
return super.getId();
}
/**
* @hibernate.property column="name"
* @return the name
*/
public String getName() {
return name;
}
/**
* @hibernate.property column="monday_hours"
* @return mondayHours
*/
public Float getMondayHours() {
return mondayHours;
}
/**
* @spring.validator type="required"
* @spring.validator type="maxlength"
* @spring.validator-args arg1value="${var:maxlength}"
* @spring.validator-var name="maxlength" value="100"
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @spring.validator type="float"
* @spring.validator type="floatRange" msgkey="errors.mondayhours.range"
* @spring.validator-args arg1value="${var:min}"
* @spring.validator-args arg2value="${var:max}"
* @spring.validator-var name="min" value="0.5"
* @spring.validator-var name="max" value="8.0"
* @param mondayHours the mondayHours to set
*/
public void setMondayHours(Float mondayHours) {
this.mondayHours = mondayHours;
}
------------------------------------------------------------------------------------------------
I just included 2 of the setter/getter methods because they are all similar.
On the other side, i have the other class, the big one, WeekActivity:
/**
* @hibernate.class table="week_activity"
*/
public class WeekActivity extends PersistentObject{
private User user;
private Week week;
private Activity activity = new Activity();
private Boolean isAuthorized = Boolean.FALSE;
/**
* @hibernate.id column="id" generator-class="native"
*/
public String getId() {
return super.getId();
}
/**
* @hibernate.one-to-one cascade="save-update"
* @return the activity
*/
public Activity getActivity() {
return activity;
}
/**
* @hibernate.property column="is_authorized"
* @return the isAuthorized
*/
public Boolean getIsAuthorized() {
return isAuthorized;
}
/**
* @hibernate.many-to-one column="user_id" cascade="save-update"
* @return the user
*/
public User getUser() {
return user;
}
/**
* @hibernate.many-to-one column="week_id" cascade="save-update"
* @return the week
*/
public Week getWeek() {
return week;
}
/**
* @spring.validator type="required"
* @param activity the activity to set
*/
public void setActivity(Activity activity) {
this.activity = activity;
}
/**
* @spring.validator type="required"
* @param isAuthorized the isAuthorized to set
*/
public void setIsAuthorized(Boolean isAuthorized) {
this.isAuthorized = isAuthorized;
}
/**
* @spring.validator type="required"
* @param user the user to set
*/
public void setUser(User user) {
this.user = user;
}
/**
* @spring.validator type="required"
* @param week the week to set
*/
public void setWeek(Week week) {
this.week = week;
}
}
------------------------------------------------------------------------------------------------
Like i said previously, when i try to save the whole WeekActivity from the
jsp, i fill the user.id and week.id fields on the onSubmit method in the
WeekActivityFormController. But, i am not able to also persist the activity
(so it gets a newly generated ID each time) before that. And i need to do
this because i need a new activity.id each time i fill the WeekActivity form
(the activity.id will be unique in the WeekActivity table). This is what i
have so far in the controller:
protected void onBind(HttpServletRequest request, Object command,
BindException errors) throws Exception {
super.onBind(request, command);
UserWeekActivity userWeekActivity = (UserWeekActivity) command;
// Here we get parameters to fill in User and Week
objects...
String userId = request.getParameter("user.id");
String weekId = request.getParameter("week.id");
// We obtain the User and Week from the request parameters
// because User and Week are already in the database...
if (userId != null) {
if (userWeekActivity.getUser() == null) {
User user = (User) manager.get(User.class,
userId);
userWeekActivity.setUser(user);
}
}
if (weekId != null) {
if (userWeekActivity.getWeek() == null) {
Week week = (Week) manager.get(Week.class,
weekId);
userWeekActivity.setWeek(week);
}
}
// Now i try to set the corresponding Activity object too...
Activity theActivity = userWeekActivity.getActivity();
// Setting Activity properties from parameters too (except
the ID!)
String activityName = request.getParameter("activity.name");
if (activityName != null &&
(!StringUtils.isEmpty(activityName.trim()))) {
theActivity.setName(activityName);
}
String activityMon =
request.getParameter("activity.mondayHours");
if (activityMon != null &&
(!StringUtils.isEmpty(activityMon.trim()))) {
theActivity.setMondayHours(new
Float(Float.parseFloat(activityMon)));
}
String activityTue =
request.getParameter("activity.tuesdayHours");
if (activityTue != null &&
(!StringUtils.isEmpty(activityTue.trim()))) {
theActivity.setTuesdayHours(new
Float(Float.parseFloat(activityTue)));
}
String activityWed =
request.getParameter("activity.wednesdayHours");
if (activityWed != null &&
(!StringUtils.isEmpty(activityWed.trim()))) {
theActivity.setWednesdayHours(new
Float(Float.parseFloat(activityWed)));
}
String activityThu =
request.getParameter("activity.thursdayHours");
if (activityThu != null &&
(!StringUtils.isEmpty(activityThu.trim()))) {
theActivity.setThursdayHours(new
Float(Float.parseFloat(activityThu)));
}
String activityFri =
request.getParameter("activity.fridayHours");
if (activityFri != null &&
(!StringUtils.isEmpty(activityFri.trim()))) {
theActivity.setFridayHours(new
Float(Float.parseFloat(activityFri)));
}
String activitySat =
request.getParameter("activity.saturdayHours");
if (activitySat != null &&
(!StringUtils.isEmpty(activitySat.trim()))) {
theActivity.setSaturdayHours(new
Float(Float.parseFloat(activitySat)));
}
String activitySun =
request.getParameter("activity.sundayHours");
if (activitySun != null &&
(!StringUtils.isEmpty(activitySun.trim()))) {
theActivity.setSundayHours(new
Float(Float.parseFloat(activitySun)));
}
// Saving the activity now makes MySQL generate a new id...
// Not sure if i should do the following lines but these are
the last i tried...
manager.save(theActivity);
String theActivityId = theActivity.getId();
theActivity.setId(theActivityId);
userWeekActivity.setActivity(theActivity);
}
------------------------------------------------------------------------------------------------
As you can see above, i pass some activity properties in the request (all of
them actually, except the ID!). So i fill the Activity object too, persist
it so i get the ID (should this be necessary?) and the get the ID again and
set this Activity into the big WeekActivity object. The bad part is when i
run this... i get the following:
Hibernate operation: could not insert: [WeekActivity]; uncategorized
SQLException for SQL [insert into week_activity (is_authorized, user_id,
week_id) values (?, ?, ?)]; SQL state [HY000]; error code [1364]; Field
'activity' doesn't have a default value; nested exception is
java.sql.SQLException: Field 'activity' doesn't have a default value
Obviously it can't have a default value, because the ID should be generated
each time and before saving the "big" WeekActivity.
I have already wasted a week trying to solve this...I'm pretty new to J2EE
and much more to Hibernate and Spring so please bear with me and my ugly
code ;) but i'm desperate! Ther must be something i am doing wrong...maybe
not just one thing but more...
Thanks a lot for reading and lending a hand, you are the best! :)
Best regards.
Michael Horwitz wrote:
>
> O.K. It should all work as long as you have the relationship between
> WeekActivity and Activity marked as cascade=save. If you are having
> trouble
> with the mapping/annotations just post up a sample of what you have so
> far,
> and we can help.
>
> Mike.
>
> On 7/14/07, Sielm <[EMAIL PROTECTED]> wrote:
>>
>>
>> Sorry, i forgot about these details. I'm using AppFuse 1.9.4 with Spring
>> for
>> the front end too, and Hibernate for persistence. The actual database is
>> MySQL 5.x (not sure about the exact version).
>>
>> Thanks a lot. If i forget anything else please tell me and i will reply
>> as
>> soon as possible.
>>
>> Best regards.
>>
>>
>> Michael Horwitz wrote:
>> >
>> > Which version of AppFuse are you using and with which web front end?
>> > Details
>> > as to which persistence layer you have chosen would also be useful:
>> > Hibernate, JPA or iBatis?
>> >
>> > P.S. You English is excellent, by the way!
>> >
>> > Thanks
>> >
>> > Mike.
>> >
>> > On 7/13/07, Sielm <[EMAIL PROTECTED]> wrote:
>> >>
>> >>
>> >> Hi all. I'm new to J2EE and AppFuse and have been tinkering with it
>> for
>> a
>> >> while now. The main thing is this: i have a "big" object called
>> >> WeekActivity
>> >> which represents an activity made by an user in a week, and i need to
>> be
>> >> able to make a form to create new rows in the database for this
>> object.
>> >> This
>> >> object has 3 properties (attributes), which are User, Week and
>> Activity.
>> >> Each of these three are beans which go into the database. This way a
>> >> WeekActivity row in the database would have the user id, the week id,
>> the
>> >> activity id and the hibernate generated primary key ID. Roughly this
>> is
>> >> the
>> >> way this is mapped:
>> >>
>> >> · User: table user (ID, ... , other columns)
>> >> · Week: table week (ID, ..., other columns)
>> >> · Activity: table activity (ID, ..., other columns)
>> >> · WeekActivity: table user_week_activity (user.id, week.id,
>> activity.id
>> ,
>> >> ID)
>> >> · method getUser ---> hibernate.many-to-one column="user.id"
>> (because
>> >> a
>> >> user could have several activities in a week). I'm assuming this will
>> map
>> >> the ID column of the User table to this table as a foreign key (maybe
>> i
>> >> got
>> >> this wrong in hibernate?)
>> >> · method getWeek ---> same as above, a many to one for week.id
>> >> because
>> >> a
>> >> week can appear in several activities
>> >> · method getActivity ---> hibernate.one-to-one, because an
>> activity
>> >> will
>> >> have a unique ID always, for each time the form is used no matter the
>> >> user
>> >> or the week.
>> >>
>> >>
>> >> But User and Week are already in the database, so that in the
>> >> weekActivityForm.jsp i just pass the user.id and the week.id as
>> request
>> >> parameters, but i need to create a new activity.id (and insert the new
>> >> activity object into the database) each time the weekActivityForm is
>> >> filled
>> >> and submitted, and i don't see the way to do that. At this moment when
>> i
>> >> submit the form hibernate complains about activity.id not having a
>> >> default
>> >> value, because i try to save the "big object" without setting the
>> >> activity.id.
>> >>
>> >> In the WeekActivityFormController i have the method onSubmit which
>> reads
>> >> the
>> >> week.id and user.id from the request, uses the manager to fetch the
>> Week
>> >> and
>> >> User objects from the database and sets them into the WeekActivity
>> >> object.
>> >> But what can i do to also set the Activity object? The thing is that i
>> >> need
>> >> to insert a new Activity object into the database and then use the
>> >> WeekActivity.setActivity(activity) method BUT that new activity object
>> >> has
>> >> a
>> >> new generated ID each time and i don't know how to fetch it from the
>> >> onSubmit method...if i even can do that.
>> >>
>> >> I'm afraid i was a bit confusing explaining my problem...the short
>> >> version
>> >> would be: i have a commandobject in a form, and one of its properties
>> is
>> >> another object which needs to be created each time i create a new
>> >> instance
>> >> of the commandobject (because this property should be always unique)
>> and
>> >> when i try to persist the original commandobject i have no way of
>> setting
>> >> the property because i can't access the property id (which would be
>> >> generated when persisted too!)
>> >>
>> >> If someone understands my problem, i would be really grateful to hear
>> >> about
>> >> it. And if someone doesn't but wants to help and need a more indepth
>> >> explain
>> >> i would try my best. Thanks for your time and patience, and anyway a
>> big
>> >> salute for everyone in the mailing list. Have a good day :)
>> >>
>> >> PS: sorry my English is a bit lacking ;)
>> >> --
>> >> View this message in context:
>> >>
>> http://www.nabble.com/How-to-insert-a-new-object-from-another-object-%28command%29-form-tf4076716s2369.html#a11586895
>> >> Sent from the AppFuse - User mailing list archive at Nabble.com.
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> >> For additional commands, e-mail: [EMAIL PROTECTED]
>> >>
>> >>
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/How-to-insert-a-new-object-from-another-object-%28command%29-form-tf4076716s2369.html#a11593027
>> Sent from the AppFuse - User mailing list archive at Nabble.com.
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [EMAIL PROTECTED]
>> For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
--
View this message in context:
http://www.nabble.com/How-to-insert-a-new-object-from-another-object-%28command%29-form-tf4076716s2369.html#a11610772
Sent from the AppFuse - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]