java - Hibernate更新实体最佳实践

标签 java hibernate spring-data-jpa

我正在尝试通过修改其子实体(代理)之一来更新实体(客户端),但存储库保存方法的行为与创建方法不同。

当我通过提供新的代理 ID 更新客户端时,代理未加载。

有人可以解释一下为什么以及如何实现这一点吗?

实体客户端:

@Entity
@Table(name = "client")
public class ClientEntity extends Serializable{

    private static final long serialVersionUID = -7451447955767820762L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int reference;

    @ManyToOne
    @JoinColumn(name = "agence_id")
    private AgenceEntity agence;

    // getter/setter
}

实体机构:

@Entity
@Table(name = "agence")
public class AgenceEntity extends AbstractGenericEntity {

    private static final long serialVersionUID = -3674920581185152947L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int id;

    @Column(nullable = false, length = 100)
    private String name;

    // getter/setter
}
<小时/>

表格代理:

Id     |  Name
  1    |    name1
  2    |    name2

表客户端:

Reference    |   agence_id
  1          |     1
<小时/>

创建客户端:确定

Agence agence = new Agence();
agence.setId(1); // load agence #1

Client client = new Client();
client.setAgence(agence);

client = clientRepository.save(client);
System.out.println(client.getReference); // print '2'
System.out.println(client.getAgence().getName()); // print 'name1'
<小时/>

更新客户端:NOK

Client client = clientRepository.findOne(1); // load client #1
Agence agence = new Agence();
agence.setId(2);
client.setAgence(agence); // update agence with agence #2
client = clientRepository.save(client);
System.out.println(client.getReference); // print '1'
System.out.println(client.getAgence().getName()); // print **NULL** !!!!

最佳答案

您尚未在“NOK”代码段中设置 Agence 上的名称,因此它将打印 null。

此外,您的主键 (id) 是用 generatedValue 注释的,因此您永远不应该调用 setId - 它是为您生成的,更改将导致不可预测的结果。

关于java - Hibernate更新实体最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18914530/

相关文章:

java - oauth 消费者 key 和消费者 secret 注册

Java 圆形(6 段)

hibernate 外键

mysql - Spring Data JPA - 为类提供了错误类型的 id。应为 : class java. lang.Integer,得到类 java.lang.Long

java - 如何在没有任何属性的情况下获取 Spring Data Jpa FindFirst1000()

java - 以编程方式解决插件外部的 Maven 依赖关系 - 获取 RepositorySystemSession 和 RepositorySystem

java - 在另一个过滤器中调用 servlet 过滤器包装器

java - 在 "java spring hibernate"中制作简单的网站太过分了

mysql - Hibernate 查询比较日期(最多过去 10 个月)

java - 如何在java中进行整数枚举声明