当前位置: 首页 > 知识库问答 >
问题:

以Locale为键映射的Hibernate注释

元景天
2023-03-14

我有这些桌子:

CREATE TABLE PRODUCT (
  ID NUMBER(19,0) NOT NULL,
  CONSTRAINT PRODUCT_PK
  PRIMARY KEY (ID)
  USING INDEX (
    CREATE UNIQUE INDEX PRODUCT_PK
    ON PRODUCT(ID)
    ...
  )
)
...

CREATE TABLE PRODUCT_LOCALE (
  PRODUCT_ID NUMBER(19,0) NOT NULL,
  LOCALE VARCHAR2(12 CHAR) NOT NULL,
  NAME VARCHAR2(160 CHAR),
  CONSTRAINT PRODUCT_LOCALE_PK
  PRIMARY KEY (PRODUCT_ID,LOCALE)
)
...

由该类表示:

public class Product extends LocalizedEntity<Product.LocalizedFields> {

  ....

  private Long id;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public static class LocalizedFields implements Serializable {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
  }

}
public abstract class LocalizedEntity<T> implements serializable {

  ....

  private Map<Locale, T> localizedFields = new HashMap<Locale, LF>();

  public Map<Locale, T> getLocalizedFields() {
    return localizedFields;
  }

  public void setLocalizedFields(Map<Locale, T> localizedFields) {
    this.localizedFields = localizedFields;
  }
}
.....
<map name="localizedFields" table="product_locale" lazy="false" fetch="select" batch-size="100">
  <cache usage="read-write" />
  <key column="product_id" not-null="true" />
  <map-key type="locale">
    <column name="locale" length="12" not-null="true" />
  </map-key>
  <composite-element class="com.myproject.Product$LocalizedFields">
    <property name="name" type="string">
        <column name="name" length="500" />
    </property>
  </composite-element>
  </map>
.....
@Entity
@Table(name = "product")
public class Product extends LocalizedEntity<Product.LocalizedFields> {

  ....

  private Long id;

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy= GenerationType.AUTO)
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @ElementCollection(fetch = FetchType.EAGER)
  @JoinTable(name = "product_locale", joinColumns = @JoinColumn(name = "product_id", nullable = false))
  @MapKeyClass(value = Locale.class)
  @MapKeyColumn(name = "locale", length = 12, nullable = false)
  @BatchSize(size = 100)
  @Fetch(FetchMode.SELECT)
  @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
  @Embedded
  public Map<Locale, LocalizedFields> getLocalizedFields() {
    return super.getLocalizedFields();
  }

  @Embeddable
  public static class LocalizedFields implements Serializable {

    ....

    private String name;

    @Column(name = "name", length = 500, nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
  }
}
@MappedSuperclass
public abstract class LocalizedEntity<T> implements serializable {

  ....

  private Map<Locale, T> localizedFields = new HashMap<Locale, LF>();

  public Map<Locale, T> getLocalizedFields() {
    return localizedFields;
  }

  public void setLocalizedFields(Map<Locale, T> localizedFields) {
    this.localizedFields = localizedFields;
  }
}

原因:org.hibernate.mappingException:无法确定:java.util.map的类型,位于表:product,列:[org.hibernate.mapping.simplevale.getType(simplevale.java:349)位于org.hibernate.mapping.simplevale.isvalid(simplevale.java:322)位于org.hibernate.mapping.property.isvalid(property.java:241)位于org.hibernate.mapping.persistentclass.validate(ERNATE4.LocalSessionFactoryBean.AfterPropertiesSet(LocalSessionFactoryBean.java:439)位于org.SpringFramework.Beans.Factor.Support.AbstracTautOWIRECAPABLEBeanFactor.InvokeInitMethods(AbstracTautOWIRECAPABLEBeanFactor.1633)位于org.SpringFramework.Beans.Factor.Support.AbstracTautOWIRECAPABLEBeanFactor.InitializeBean(

如果我用@mapkey(“locale”)替换@mapkeyclass(value=locale.class)和@mapkeycolumn,则会引发以下错误:

原因:org.hibernate.AnnotationException:未找到关联类:com.myproject.product$localizedfields在org.hibernate.cfg.Annotations.mapbinder.bindkeyfromAssociationTable(mapbinder.java:133)在org.hibernate.cfg.Annotations.mapbinder.access$000(mapbinder.java:76)在org.hibernate.cfg.Annotations.mapbinder.mapbinder$1。secondpass(mapbinder.java:111)在t org.springframework.orm.hibernate4.localsessionfactorybean.afterpropertiesset(localsessionfactorybean.java:439)在org.springframework.beans.factor.support.abstractautowirecapablebeanfactor.invokeInitMethods(abstractautowirecapablebeanfactor.1633)在

共有1个答案

姜经武
2023-03-14

我发现问题是关键的“区域”

根据JPA文档(http://docs.oracle.com/javaee/6/api/index.html?javax/persistence/mapkeyclass.html):

“为java.util.map类型的关联指定映射键的类型。映射键可以是基本类型、可嵌入类或实体”

有了这些注释,它必须工作:

@ElementCollection(fetch = FetchType.EAGER)
@JoinTable(name = "product_locale", joinColumns = @JoinColumn(name = "product_id", nullable = false))
@MapKeyColumn(name = "locale", length = 12, nullable = false)
@MapKeyType(value = @Type(type = "locale"))
@BatchSize(size = 100)
@Fetch(FetchMode.SELECT)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
 类似资料:
  • 我想让hibernate生成一些带有外键的表等等。我将给出我希望hibernate生成的查询的一个示例: 所以这个查询应该由hibernate通过注释生成。与此对应的类是: 有关中的应映射到的内容的示例(中的每个助记符在中只有一个值): 正如您所看到的,我在文档的帮助下做了一些尝试,但是我不能让Hibernate生成外键。如果有人能告诉我这个类需要的注释和值,那就太好了,这样我就可以自己为其他类做

  • 在MySQL数据库上有一个没有任何主键的表。我想使用hibernate访问Java的数据端。但是,hibernate无法解析映射文档。其他表映射正确。这个问题是不是没有主键的原因?我必须至少创建一个主键来映射此表吗?还是还有别的什么? 表

  • 如果我没有指定JoinColumn,hibernate将尝试使用字段child_username和child_parentid进行映射。如果我只指定一个Joincolumn,我会得到一个断开的映射。如果指定了两个JoinColumns,则parent上没有列可指定。 我如何映射这个类并将用户名作为标准传入?(它来自身份验证数据)或者如果我偏离了轨道,我如何以不同的方式这样做。

  • 我正在尝试我们非主键作为外键在我的应用程序。场景如下:我有EMPLOYEE和EMPLOYEE_PROPERTIES表。Employee和Employee属性之间存在一对多的关系。下面是我的架构: 下面是我的hibernate映射XML:------------------------------- -------------员工属性------------------- 是否可以引用非主键作为外键

  • 我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:

  • Hi编写Spring应用程序,使用Spring Security。这是我的用户和帐户角色数据库: 我的实体类: 当我尝试登录我的系统我有错误: Hibernate:选择userrolese0_. username作为username3_1_0_,userrolese0_. id作为id1_0_0_,userrolese0_. id作为id1_0_1_,userrolese0_. name作为nam