4

我不知道如何在 Hibernate 中强制只读列。

我想将 idgroup 设置为只读列。即使我设置insertable=falseand updatable=false,在休眠 SQL 中我也可以阅读:

Hibernate: insert into groups (description, name, account_idaccount, idgroup) values (?, ?, ?, ?) 

但我想获得:

insert into groups (description, name, account_idaccount) values (?, ?, ?) 

这是我的课程:

@Entity
@Table(name = "groups")
public class Group implements java.io.Serializable {

private static final long serialVersionUID = -2948610975819234753L;
private GroupId id;
private Account account;
private String name;
private String description;

@EmbeddedId
@AttributeOverrides({@AttributeOverride(name = "idgroup", column = @Column(name = "idgroup", insertable = false)),
        @AttributeOverride(name = "accountIdaccount", column = @Column(name = "account_idaccount", nullable = false))})
public GroupId getId() {
    return id;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account_idaccount", nullable = false, insertable = false, updatable = false)
public Account getAccount() {
    return account;
}

@Column(name = "description", length = 512)
public String getDescription() {
    return description;
}


@Column(name = "name", nullable = false, length = 128)
public String getName() {
    return name;
}
..
}
@Embeddable
public class GroupId implements java.io.Serializable {

private int idgroup;
private int accountIdaccount;

@Column(name = "idgroup", insertable= false, updatable= false)
public int getIdgroup() {
    return this.idgroup;
}


@Column(name = "account_idaccount", nullable = false)
public int getAccountIdaccount() {
    return this.accountIdaccount;
}
..
}

我想为 idgroup 设置一个只读列,因为我可以利用 DBMS 的 id 自动生成,我不想在 Hibernate 中使用密钥自动生成,因为它不是集群安全的。

4

5 回答 5

13

我认为您可以将@Column注释标记为updatable=false

于 2013-01-31T13:05:32.047 回答
2

简单的:

@Column(insertable = false, updatable = false)
于 2019-03-03T00:46:06.707 回答
0

我能够通过使用 2 个 DAO 对象来实现这一点。我知道它可能不是首选,但我没有看到另一种解决方法。将字段设置为insertable=false并且updatable=false不从插入 SQL 中删除列,因此 Postgres 不会调用default操作来填充这些列值。

   // GroupWrite

   @Entity
   @Table(name = "group")
   public class GroupWrite {

      @Id
      @Column(name = "account")
      private Account account;

      @Column(name = "name")
      private String name;

      @Column(name = "description")
      private String description;


      /* Getters and Setters */
  }

--

   // GroupRead

   @Entity
   @Table(name = "group")
   public class GroupRead {

      @EmbeddedId
      @Column(name = "id")
      private GroupId id;

      @Column(name = "account")
      private Account account;

      @Column(name = "name")
      private String name;

      @Column(name = "description")
      private String description;


      /* Getters and Setters */
  }

然后您需要GroupRead在使用select查询时和GroupWrite在执行insertupdate查询时使用。

如果您想以一种通用的方式使用两者的属性,您可以实现一个描述重叠字段的接口。

   public interface Group {

        Account getAccount();

        void setAccount(Account account);
   }

   public class GroupWrite implements Group {...}

   public class GroupRead implements Group {...}

希望这可以帮助。

于 2019-12-02T14:35:31.047 回答
-2

解决方案是使用包装类,例如Integer而不是原始类型,例如int. 当 Hibernate 将获得一个空指针时,它会将 id 的生成委托给 DBMS。

于 2013-02-18T13:49:29.683 回答
-3

在这种情况下,@ReadOnlyProperty 注释将帮助您。

于 2015-08-18T09:14:34.380 回答