【问题标题】:Hibernate 3 Annotation Mapping IssueHibernate 3注释映射问题
【发布时间】:2013-06-20 18:58:05
【问题描述】:

我是 Hiberante 3 的新手。当我尝试使用以下关系映射三个表时遇到问题:

ITEM_MASTER (Table):
ITEM_ID-PK
LOCATION_ID

ITEM_MASTER_ATTR (Table):
ITEM_ID - FK
ITEM_ATTR_ID - FK
ITEM_ATTR_VALUE - STRING

ITEM_ATTR (Table):
ITEM_ATTR_ID - PK
ITEM_ATTR_NAME - STRING

每个Item 可以在Item_master_attr 表中具有多个属性。 每个Item Attribute name 都将存储在Item_Attr 表中。

详细说明:

Item 1 ----> Attr 1 -----> Attr Name 1
Item 1 ----> Attr 2 -----> Attr Name 2
Item 2 ----> Attr 1 -----> Attr Name 1

任何帮助都非常重要。


我现在以同样的方式创建了这个类,但不清楚在创建操作时如何设置数据。

@Entity
@Table(name = "item_attributes")
public class ItemAttributeDTO implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4678662910814121175L;
    private int itemAttributeID;
    private String itemAttrName;

    @OneToMany(mappedBy = "itemAttributeMapDTO")
    private Collection<ItemAttributeMapDTO> itemAttributeMap = new ArrayList<ItemAttributeMapDTO>();

    @Id
    @GeneratedValue
    @Column(name = "ITEM_ATTR_ID", unique = true, nullable = false)
    public int getItemAttributeID() {
        return itemAttributeID;
    }

    public void setItemAttributeID(int itemAttributeID) {
        this.itemAttributeID = itemAttributeID;
    }

    @Column(name = "ATTR_NAME")
    public String getItemAttrName() {
        return itemAttrName;
    }

    public void setItemAttrName(String itemAttrName) {
        this.itemAttrName = itemAttrName;
    }

    public Collection<ItemAttributeMapDTO> getItemAttributeMap() {
        return itemAttributeMap;
    }

    public void setItemAttributeMap(
            Collection<ItemAttributeMapDTO> itemAttributeMap) {
        this.itemAttributeMap = itemAttributeMap;
    }

}


@Entity
@Table(name = "item_master")
public class ItemMasterDTO implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4678662910814121175L;
    private int itemID;
    private int locationId;

    @OneToMany(mappedBy = "itemMasterDTO", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Collection<ItemAttributeDTO> itemAttributeDTO = new ArrayList<ItemAttributeDTO>();

    @Id
    @Column(name = "ITEM_ID", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getItemID() {
        return itemID;
    }

    public void setItemID(int itemID) {
        this.itemID = itemID;
    }

    @Column(name = "LOCATION_ID")
    public int getLocationId() {
        return locationId;
    }

    public void setLocationId(int locationId) {
        this.locationId = locationId;
    }

    public Collection<ItemAttributeDTO> getItemAttributeDTO() {
        return itemAttributeDTO;
    }

    public void setItemAttributeDTO(
            Collection<ItemAttributeDTO> itemAttributeDTO) {
        this.itemAttributeDTO = itemAttributeDTO;
    }

}

@Entity
@Table(name = "ITEM_MASTER_ATTRIBUTES")
public class ItemAttributeMapDTO {

    @ManyToOne
    @JoinColumn(name = "ITEM_ID")
    private ItemMasterDTO itemMasterDTO;

    @ManyToOne
    @JoinColumn(name = "ITEM_ATTR_ID")
    private ItemAttributeDTO itemAttributeDTO;

    private int item_master_id;

    public ItemMasterDTO getItemMasterDTO() {
        return itemMasterDTO;
    }

    public void setItemMasterDTO(ItemMasterDTO itemMasterDTO) {
        this.itemMasterDTO = itemMasterDTO;
    }

    public ItemAttributeDTO getItemAttributeDTO() {
        return itemAttributeDTO;
    }

    public void setItemAttributeDTO(ItemAttributeDTO itemAttributeDTO) {
        this.itemAttributeDTO = itemAttributeDTO;
    }

    @Id
    @Column(name = "ITEM_MASTER_ATTRIBUTE_ID", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    public int getItem_master_id() {
        return item_master_id;
    }

    public void setItem_master_id(int item_master_id) {
        this.item_master_id = item_master_id;
    }

}


    Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction tx = session.beginTransaction();


            //Set the Item Master
            ItemMasterDTO itmDto = new ItemMasterDTO();
            itmDto.setLocationId(100);

            //Set the Item Attributes
            ItemAttributeDTO itmAttDto = new ItemAttributeDTO();

            ????.......

【问题讨论】:

  • 检查onetomany注解mkyong.com/hibernate/…
  • onetomany 我们可以映射 2 个表。但是我如何将 Item_master_attr 映射回 Item_attr。你能说得更具体些吗?
  • 刚刚发布了一个答案,看看能不能留住你
  • 刚刚发布了一个答案,看看能不能帮到你
  • 我根据您的建议进行了更新。您现在可以帮助我了解如何在创建操作时设置数据。我将有预定义的数据 ITEM_ATTR 表。因此,在创建操作期间,我需要在主表中插入 1 条记录,并且需要根据 Attr Name 提取 Item_Attr Id,然后我需要在 Mapping 表中将 Item 与多个 Attrs 进行映射。希望您现在了解情况。

标签: hibernate hibernate-mapping


【解决方案1】:

下面是一个示例,说明如果您使用 hibernate 注释,您的类会是什么样子:

ITEM_MASTER_ATT 类 - 根据外键注释 ManyToOne

@Entity
public class ITEM_MASTER_ATTR {

    @ManyToOne
    @JoinColumn(name = "ITEM_ID")
    private ITEM_MASTER itemMaster;   

    @ManyToOne
    @JoinColumn(name = "ITEM_ATTR_ID")
    private ITEM_ATTR itemAttr;   

}

ITEM_MASTER 类 - 使用 mappedBy 字段根据逆向注释 OneToMany。

@Entity
public class ITEM_MASTER {

    @OneToMany(mappedBy = "itemMaster")
    private Collection<ITEM_MASTER_ATTR> masterAttr = new    ArrayList<ITEM_MASTER_ATTR>();

}

ITEM_ATTR 类使用 mappedBy 字段根据逆向注释 OneToMany。

@Entity
public class ITEM_ATTR {

    @OneToMany(mappedBy = "itemAttr")
    private Collection<ITEM_MASTER_ATTR> masterAttr = new    ArrayList<ITEM_MASTER_ATTR>();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2011-07-31
    • 2021-10-24
    相关资源
    最近更新 更多