Рассмотрим диаграмму:Каким образом сохраняются расширенные классы?
Я работаю с JPA в течение короткого промежутка времени, и до сих пор, я никогда не имел необходимости упорствовать расширенные классы ... Как вы можете видеть на Например, SNMPNode
, IPNode
и т. д. все расширенные классы от Node
, которые также распространяются от GeoLocation
.
Я понимаю, что я могу аннотировать мастер-классы с @MappedSuperclass
и IPNode
и SNMPNode
наследуют свои свойства сохраняющиеся ... Но в этом случае я в конечном итоге с почти идентичных таблиц и, в моем понимании, вместо того, чтобы делать это Я мог бы просто сгруппировать всю информацию в узле и работать с одной таблицей.
Является ли это продолжением расширенных классов в работе JPA или моими понятиями являются неправильными?
То же самое, возобновленного кусок кода:
public class Node extends GeoLocation {
private String name;
private Group group;
private Location location;
private Type type;
private Company company;
}
public class IPNode extends Node {
private Long id;
private String ipAddress;
}
public class SNMPNode extends Node {
private Long id;
private SNMPServer server;
}
[[РЕДАКТИРОВАНИЕ ПОСЛЕ ОТВЕТА ОТ ЭТОЙ ТОЧКИ]]
Ради содействия, вот образец что я делаю:
ИНОД:
public interface INode {
public Long getId();
public void setId(Long id);
public String getName();
public void setName(String name);
public String getIpAddress();
public void setIpAddress(String ipAddress);
public String getCommunity();
public void setCommunity(String community);
}
Узел:
@Entity
@DiscriminatorValue("N")
@DiscriminatorColumn(name="NODE_TYPE",discriminatorType=DiscriminatorType.STRING, length=20)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public abstract class Node extends GeoLocation implements INode {
@Id
@GeneratedValue
private Long id;
private String name;
public Long getId() {return id;}
public void setId(Long id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
(... Overrides from INode ...)
}
IPNode:
@Entity
@DiscriminatorValue("I")
public class IPNode extends Node {
private String ipAddress;
public String getIpAddress() { return this.ipAddress;}
public void setIpAddress(String ipAddress) { this.ipAddress = ipAddress; }
(... Overrides from INode ...)
}
SNMPNode:
@Entity
@DiscriminatorValue("S")
public class SNMPNode extends Node {
private String community;
public String getCommunity() { return community;}
public void setCommunity(String community) { this.community = community; }
(... Overrides from INode ...)
}
NodeRepository:
@Repository
public interface NodeRepository extends JpaRepository<Node, Long> { }
Так что теперь я могу делать вещи, как это:
@ContextConfiguration("classpath:/spring/application-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class NodeRepositoryTest {
@Autowired
NodeRepository repo;
private INode node;
@Before
@Transactional
@Rollback(false)
public void setup() {
node = new IPNode();
node.setName("ipNode");
node.setIpAddress("1.1.1.1");
repo.save((IPNode)node);
node = new SNMPNode();
node.setName("snmpNode");
node.setIpAddress("2.2.2.2");
node.setCommunity("some text");
repo.save((SNMPNode)node);
}
@Test
@Transactional
public void Test() throws Exception {
INode testNode = repo.findOne(1L);
assertNotNull(testNode);
}
}
обоих типов узлов сохраняются на том же столе, и поэтому их ключи не могут повторить ... Мой REST URL может захватить их/узлами/1 или/узлы/2, который был моей главной целью в конце концов ...
Спасибо :)
Простая проверка google («jpa inheritance»): вы получите http://en.wikibooks.org/wiki/Java_Persistence/Inheritance – jmvivo
Очень приятные документы. Таблицы примеров очень легко понять. Благодарю. –