【问题标题】:Saving complicated object to database将复杂对象保存到数据库
【发布时间】:2015-01-05 00:21:23
【问题描述】:

我想把这个对象保存到db,但是我不知道该怎么做..

 

    public class Board {
      private String name;
      private Sticker sticker;
     Board(String name, Sticker sticker){
      this.name=name;
      this.sticker = sticker;
    }

    }

    public interface Sticker {
      public void doSomething();
    }

    public class FreeSticker implements Sticker {
      @Override
      public void doSomething(){
       System.out.println("I'm freeSticker");
      }
    }
    public class ProSticker implements Sticker {
      @Override
      public void doSomething() {
        System.out.println("I'm proSticker");
      }
    }

现在我想将带有集合名称和一些贴纸(比如说 FreeSticker)的新 Board 对象保存到数据库。如何? name 很简单,因为在每个 db 中我们都有 String 类型,但是 Sticker 呢?我知道,我可以为 FreeSticker 和 ProSticker 创建另一个表,但是当我们有超过 2 个 Sticker 实现时,这很复杂。我不是要求超级解决方案,但请给我一些教程的链接,因为我找不到任何关于此的信息。谢谢:)

【问题讨论】:

  • 您的Sticker 不包含任何属性,也不会更改Board 的属性。但万一它改变了 Board 对象的任何属性,即使如此,Board 表的架构仍将保持不变。
  • 您的Sticker 实现没有状态。你打算保存什么?
  • 对于一般的ORM 信息,请查看hibernate.org/orm/what-is-an-orm
  • 如果您想存储对象但不需要使用数据库功能(即使用 SQL 访问它们),那么您可以对 blob 使用序列化。在标准 Java 教程中搜索序列化。
  • 哦,这只是示例,您可以假设 Sticker 实现具有状态,例如某些字段内容或名称..

标签: java database class interface


【解决方案1】:

您的表格应包含每个状态值的列。在您的情况下,有两个,此外,将唯一 ID 字段作为主键通常很好。所以,在 PostgreSQL ...

CREATE TABLE board (
    id       SERIAL NOT NULL,
    name     text,
    sticker  boolean);

或者,如果您计划/期望拥有多个贴纸。

CREATE TABLE sticker (
    id       SERIAL NOT NULL,
    name     text);

CREATE TABLE board (
    id       SERIAL NOT NULL,
    name     text,
    sticker  int REFERENCES sticker(id) NOT NULL);

【讨论】:

  • 也许应该是贴纸包含字段 board int references board(id) NOT NULL,而不是 board 有字段贴纸。因为 board 可以有很多贴纸,贴纸只能在一个板上。 ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多