2015-10-21 2 views
0

У меня есть сущность пользователя и проекта, что у них есть отношения «один ко многим», и я хочу найти пользователя, затем найти конкретный проект, принадлежащий пользователю, а затем обновить его, но я не может. рамки Struts2 + Hibernate.обновить все поля объекта в jpa

@Entity (name = "User") 
@Table (name = "users") 
public class User implements Serializable{ 
@Id 
@Column (name = "user_id", columnDefinition = "number") 
@SequenceGenerator(name = "seq", sequenceName = "gen") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "seq") 
private int id; 

@Basic 
@Column(name = "user_name", columnDefinition = "nvarchar2(20)") 
private String userName; 

@Basic 
@Column(name = "password", columnDefinition ="nvarchar2(20)") 
private String password; 

@Basic 
@Column(name = "create_date",columnDefinition = "date") 
private Date creation_date; 

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private List<Project> projectses; 

public List<Project> getProjectses() { 
    return projectses; 
} 

public void setProjectses(List<Project> projectses) { 
    this.projectses = projectses; 
} 

и сущность проекта

@Entity(name = "Project") 
@Table(name = "project") 
public class Project implements Serializable { 
@Id 
@Column(name = "project_id" , columnDefinition = "number") 
@SequenceGenerator(name = "projectSeq", sequenceName = "projectGen") 
@GeneratedValue(strategy = GenerationType.AUTO,generator = "projectSeq") 
private int projectId; 

@Basic 
@Column(name = "project_name" , columnDefinition = "nvarchar2(20)") 
private String projectName; 

@Basic 
@Column(name = "project_description" , columnDefinition = nvarchar2(20)") 
private String projectDescription; 

@Basic 
@Column(name = "start_date",columnDefinition = "date") 
private Date startDate; 

@Basic 
@Column(name = "due_date",columnDefinition = "date") 
private Date dueDate; 

@Basic 
@Column(name = "project_status",columnDefinition = "nvarchar2(20)") 
private String projectStatus; 

@Basic 
@Column(name = "project_amount",columnDefinition = "number(8)") 
private int projectAmount; 
+0

* но я не могу * - пожалуйста, уточните, как вы пытаетесь это сделать, какие ошибки возникают и т. Д. –

+0

Должен ли вступить в столбец быть project_id? – Forkmohit

+0

@SashaSalauyou мой метод обновления имеет параметр (Пользователь пользователя), тогда Пользователь userProject = (Пользователь) entityManager.createQuery («выберите u из пользователя u, где u.id =: userId»). SetParameter («userId», user.getId ()) getSingleResult(). userProject.setProject (user.getProject); entityManager.persist (userProject); и ошибка слишком велика для столбца – Hami

ответ

0

Три поправки приходят в виде, что может сделать ваш код ведет себя хорошо:

  • Использования EntityManager#find() вместо HQL для поиска объекта по идентификатору;

  • Используйте только один из @Basic или @Column (я бы предпочел @Column), нет необходимости использовать оба элемента для одного элемента;

  • Если ошибка «значение слишком велико для столбца», может быть, настало время, чтобы проверить некоторые из Project элементов больше, чем 20 символов, определенных в columnDefinition?

Проверить длину строковых элементов в Project сущностей, и если есть несколько длиннее 20 символов, скажем, 500, изменить columnDefinition для этих элементов, е. г .:

@Column(name = "project_description", columnDefinition = "nvarchar2(500)") 
private String projectDescription; 

Я также предлагаю, чтобы удалять таблицы после таких изменений (чтобы JPA создавать новые в соответствии с новыми определениями), либо вручную изменить их определения в БД.

0
User u = (User)entityManager.createQuery(SELECT u FROM User u JOIN FETCH u.Project where u.id = :id).setParameter("id",your_userId).uniqueResult(); 

Получить объект пользователя, вы получите его с множеством проектов, связанных с этим пользователем

обновление данных вы хотите: -

List<Project> userProjects = u.getProjectses(); 
for(int i = 0 ; i < userProjects.size() ; i++){ 
    Project p = userProjects.get(i); 
    entityManager.getTransaction().begin(); 
    p.setProjectName("test"); 
    entityManager.merge(p); 
    entityManager.getTransaction().commit(); 
} 
Смежные вопросы