3

我有一个类似于以下的实体:

@Entity
@Table( name="marchi", uniqueConstraints=@UniqueConstraint(columnNames="codice") )
public class Marchio implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private String codice;

    private String nome;
//...
}

我用codice = 123创建了一个Marchio,然后我坚持它。好的!

然后我通过查询从数据库中检索它,用某些东西编辑“nome”属性并调用merge()。好的!

然后我用codice = 123 创建另一个Marchio。我在 nome 中放了一些东西并调用merge()

结果是:

ConstraintViolationException:键“代码”的重复条目“123”

很好,其实我可以使用第一种方式:查询、编辑属性和合并。

考虑一下我不仅有“名字”。我有 35 个不同的属性,所以我不想:

Marchio m = em.findCodice("123");
m.setP1("1");
m.setP2("2");
...
m.setPN("N");
em.merge(m); 

我能怎么做?

4

4 回答 4

3

如果我理解得很好,您已经有了一个具有更新值的分离对象,并且您不想从数据库中检索相应的对象并调用许多 set 方法对其进行更新。完成此操作的唯一方法是删除旧对象,然后保留分离的新对象:

em.remove(oldobj);
em.persist(newobj);
于 2013-01-08T08:16:55.113 回答
0

在spring数据中,您可以简单地

myRepository.save(entity)
于 2021-12-23T11:38:48.570 回答
0

merge 方法的主要目的是使用分离实体实例中的新字段值更新持久实体实例。首先,我们需要从持久化上下文中获取一个持久化实体实例,并用这个分离实例的新值更新它的字段。因此,merge 方法正是这样做的:通过从传递的对象中获取的 id 找到一个实体实例(从持久性上下文中检索现有的实体实例,或者从数据库中加载一个新的实例)将字段从传递的对象复制到这个实例返回一个新更新的实例。当你这样做时:“然后我用 codice = 123 创建另一个马尔乔”你会创建一个处于瞬态的新马尔乔(没有身份证)。新马尔乔与数据库中的马尔乔不同。对于处于瞬态操作 MER​​GE 的新 Marchio,请执行 sql 插入。对于处于持久状态操作 MER​​GE 的老 Marchio 执行 sql 更新。对于 Insert 你有一个唯一的约束。这是数据库中的异常。首先,从基础( find() 或 getReference() )中获取 Marchio。然后更改其中的字段(Persistent Marchio),然后调用 MERGE。所有这些都应该是一个工作单元(一个事务)。

于 2022-02-16T09:43:25.007 回答
-1

试试这个:

@Table(name = "marchi", uniqueConstraints={@UniqueConstraint(columnNames="codice"), @UniqueConstraint(columnNames="nome")})

I believe with the above you can have:

codice nome
123     A
123     B
123     C
于 2013-01-04T16:36:56.313 回答