我已经搜索了很长一段时间试图解决这个问题。我正在使用带有EclipseLink(Oracle DB)的JPA。我有一个充满值的查找表。我有另一个表与该表有FK关系。我可以很好地插入数据,但是当我尝试使用不同的值更新表时,我得到一个例外。我尝试过设置CASCADE_TYPE,但没有任何影响。我认为这很简单,但也许我错过了一些东西。
查找表:
public class SomeType implements Serializable {
@Id
@Column(name = "ID")
private Short id;
@Column(name = "TYPE")
private String type;
:
(getters & setters)
}
内容:
ID Type
------------
1 Type1
2 Type2
3 Type3
: :
人员表(我为了简洁而遗漏了测序内容):
public class Person implements Serializable {
@Id
@Column(name = "ID")
private Short id;
@JoinColumn(name = "SOME_TYPE", referencedColumnName = "ID")
@ManyToOne(optional = false)
private SomeType someType;
:
(getters & setters)
}
插入工作正常:
EntityManager em;
:
Person p = new Person();
p.setSomeType(new SomeType(1));
em.persist(p);
结果是:
ID SOME_TYPE
------------------
1 1
但是如果我想更新Person以更改类型:
EntityManager em;
:
Person p = em.find(1);
SomeType newtype = new SomeType(2);
p.setSomeType(newtype);
em.merge(p);
我看到以下异常:
Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [SomeType] is mapped to a primary key column in the database. Updates are not allowed.
我想要的只是要更新的Person表中的值,如:
UPDATE PERSON set SOME_TYPE = 2 where ID = 1;
非常感谢任何帮助。感谢。
答案 0 :(得分:0)
感谢Chris回答这个问题: 如果您使用对要引用的对象的托管实例的引用,而不是创建新实例,则可以进行更新。
Person p = em.find(1);
p.setSomeType(em.find(SomeType.class, 2));
em.merge(p);