Hibernate - 使用Embedded时的AttributeOverride默认值

时间:2017-01-14 17:09:43

标签: java postgresql hibernate

如果在Hibernate中使用@Embedded,如何覆盖@Column columnDefinition? 更具体地说,有一个例子:

DoStuffB.as_view()

和类ParentGrossNetTransformVariables:

DoStuffA.decorators

我用的是:

@Embedded
@AttributeOverrides({ @AttributeOverride(name = "isnettogross", column = @Column(name = "isnettogross", columnDefinition="char(1) default 1", nullable = false))})
public ParentGrossNetTransformVariables grossNetTransform;

自动应用数据库中的更改。现在我需要在多个实体中添加ParentGrossNetTransformVariables,但使用不同的默认值“isnettogross”,以便我尝试使用@AttributeOverrides但它不起作用。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

我假设“它不起作用”,因为对列名的更改没有反映在数据库中。

hbm2ddl.auto=update不会更新架构。因此,您对列名称所做的更改不会反映在数据库中。

将其更改为create,以便根据所做的更改重新创建架构(如果有)。

<强>更新

在您的可嵌入类中使用insertable=false属性和columnDefintion,即

@Column(name = "isnettogross", columnDefinition="char(1) default 0", nullable = false, insertable=false)

和实体类

@AttributeOverrides({ @AttributeOverride(name = "isnettogross", column = @Column(name = "isnettogross", columnDefinition="char(1) default 1", nullable = false, insertable=false))})

这会忽略触发的INSERT语句中的感兴趣的列,从而插入配置的默认值。 updatable也是如此,所以你可能也想根据你的用例使用它。

<强>最新:

我很困惑你的代码是如何工作的。我试过并经过测试;它工作正常。

我已经附上了代码,以防你想看看并交叉验证。

@Entity
public class Demo {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    @Embedded
    @AttributeOverride(name="flag", column=@Column(name="MainFlag", columnDefinition="char(1) default 1", insertable=false))
    private Misc misc;

    private Misc misc2;

    // Getters and setters



@Embeddable
public class Misc {

    @Column(name="flag", columnDefinition="char(1) default 0", insertable=false)
    private boolean flag;

    // Getters and setters

要测试的代码是一个简单的session.save(),它生成了查询

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into Demo (id) values (?)

同时附加数据库中的值:D

enter image description here