spring data jpa,在项目上共享实体,未映射的实体

时间:2018-11-16 12:24:19

标签: spring hibernate jpa

我有几个使用相同表格形式存储翻译的服务,因此我将翻译实体移至共享项目中,并尝试在该实体上具有单向@OneToMany映射。但是我一直在追随异常 Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.examples.blog.Post.translations[com.examples.shared.domain.Translation]

我的Post类看起来像这样

package com.examples.blog.domain;

import com.examples.shared.domain.Translation;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Data
@Entity
@Table(name = "POSTS")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Currency implements Serializable {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;

    private String author;

    @Embedded
    private Source source;

    @OneToMany(cascade = CascadeType.ALL,
        orphanRemoval = true)
    @JoinColumn(name = "entity_id")
    List<Translation> translations;

}

和我共享的Translation类看起来像这样:

package com.examples.shared.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "TRANSLATIONS")
@Data
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class Translation implements Serializable {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    private String id;

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

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

    @Column(name="entity_id")
    @ManyToOne
    private String entityId;

}

有人可以帮我弄清楚我在做什么错吗?

3 个答案:

答案 0 :(得分:2)

以下陈述引起您的问题:

  @Column(name="entity_id")
    @ManyToOne
    private String entityId;

您应该提到与有效实体类的关系,而不是字符串entityIdentityId的类型为String,显然不是声明​​的实体。

答案 1 :(得分:2)

您正在将一类中的第二类映射为一个类,但将多对映射为一个字符串而不是类。

更改

@ManyToOne
private String entityId;

@ManyToOne
private Currency entityId;

请参见this

答案 2 :(得分:2)

似乎休眠状态并不知道com.examples.shared.domain.Translation实体。 您应在休眠状态下查找@Entities类的类或包的列表。

如果您使用Spring Boot,请使用@EntityScan(basePackages="com.examples.shared.domain")

如果您使用Spring + Hibernate集成,请使用LocalContainerEntityManagerFactoryBean.setPackagesToScan("com.examples.shared.domain")

如果您使用普通休眠,请在 persistence.xml hibernate.cfg.xml 中添加相应的条目:

<hibernate-configuration>
    ....
    <mapping class="com.examples.shared.domain.Translation"/>
 </session-factory>
</hibernate-configuration>

或者对于Java配置,请参阅文档:http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#bootstrap-bootstrap-native-registry-MetadataSources-example