更新对FK的引用

时间:2015-05-26 15:37:48

标签: jpa foreign-keys eclipselink validationexception

我已经搜索了很长一段时间试图解决这个问题。我正在使用带有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;

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

感谢Chris回答这个问题: 如果您使用对要引用的对象的托管实例的引用,而不是创建新实例,则可以进行更新。

Person p = em.find(1);
p.setSomeType(em.find(SomeType.class, 2));
em.merge(p);