JPA OneToOne bi-directional - jpa-2.0

I have two entities and they are related to each other through a one to one relationship. User is the owner of Balance. I set Hibernate to automatically create tables and this does not seem to be working. The problem may be caused by other causes but I'd like to make sure that I have the one to one relationship configured correctly first.
Can you please check the following entities and tell me if they are correct?
#Entity
#Table(name = "users")
public class User implements Serializable {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private long id;
#OneToOne
#JoinColumn(name = "balance_id", referencedColumnName = "id")
private Balance balance;
}
#Entity
#Table(name = "balances")
public class Balance implements Serializable{
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private long id;
#OneToOne(mappedBy = "users")
private User user;
}

No, it's not correct. The value of mappedBy must be the name of the attribute, in the other entity, which is the owner side of the association:
#OneToOne(mappedBy = "balance")

Related

Getting Relationship properties using spring data neo4j node repository

If we have a Company Node like this which is linked to another Node (Location) using OWNS relationship.
#NodeEntity ("Company")
public class Company {
#Id
#Property
private String companyId;
#Property
private String partyId;
#Relationship (type = "OWNS", direction = Relationship . OUTGOING )
private Set<Location> ownedLocations;
}
OWNS relationship
#RelationshipEntity (type = "OWNS")
public class Owns {
#Property
private String ownsProperty;
#StartNode
private Company company;
#EndNode
private Location location;
}
Here is the Repository
#Repository
public interface CompanyRepository extends Neo4jRepository<Company, String> {
#Query ("match (c:Company)-[x:OWNS]-(y) where c.partyId = $0 return c,x,y")
Stream<Company> getCompaniesWithRelationsByPartyId(final String partyId);
}
So when i run this query i am getting only Company and Location entities but no OWNS ownsProperty. How to get relationship properties using above repository?
NOTE: I don't want to use #QueryResult
enter code here
You have to define the Owns relationship entity as the type for the relationship in the Company like this
#Relationship (type = "OWNS", direction = Relationship . OUTGOING )
private Set<Owns> ownedLocations;

Unable to make general purpose query, without Domain entity

I am new to springbootneo4j. I have difficulties making general purpose queries. I want to be able to make any kind of query and get result without domain entity.
I am making a query like this in repository class:
#Query("MATCH (p:Employee) RETURN ID(p) as id, p.name as name, p.salary as salary ")
that is not working, but the following query is working:
#Query("MATCH (p:Employee) RETURN p ")
My domain entity class is something like this:
#NodeEntity
public class Employee {
#Id
#GeneratedValue
private Long id;
private String name;
private int salary;
#Relationship(type = "IS_BOSSOF", direction = Relationship.UNDIRECTED) Set<Employee> reporties = new HashSet<>();
public Employee() {}
// some more code
}
Create a command is like this:
(laksmi:Employee{name:"Laksmi",salary:200}),(ashwini:Employee{name:"AshwiniV",salary:300}), (harish:Employee{name:"Harish",salary:400}), (jay)-[:IS_BOSSOF]->(mukesh), (xyz)-[:IS_BOSSOF]->(mukesh), (harish)-[:IS_BOSSOF]->(ashwini),
Whenever you are distributing properties you need to use #QueryResult annotation on your class
SDN

Designing Model with foreign key

I am building an ORM by using Unit or Work and Repository using Dapper. I have searched the internet on this problem and no luck.
I have the following tables:
As you can see, Instance has Entity inside. I have 2 approaches:
Approach 1:
public class Entity
{
public int Id {get;set;}
public string Name {get;set;}
}
public class Instance
{
public int Id {get;set;}
public Entity Entity {get;set;}
public string Name {get;set;}
}
How can I get value for Entity with this approach?
Approach 2 (according to this link):
public class Entity
{
public int Id {get;set;}
public string Name {get;set;}
}
public class Instance
{
public int Id {get;set;}
public int EntityId {get;set;}
public string Name {get;set;}
}
Which design is better for use?
You can use QueryMultiple if you want to fetch the data from two different tables and fill it up in two different POCO classes. Following is copied from here:
string sql = "SELECT * FROM Invoice WHERE InvoiceID = #InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = #InvoiceID;";
using (var connection = My.ConnectionFactory())
{
connection.Open();
using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))
{
var invoice = multi.Read<Invoice>().First();
var invoiceItems = multi.Read<InvoiceItem>().ToList();
}
}
Both the models you mentioned in your code can be handled with this approach.
As an alternative approach, you can combine your two POCOs in one or you can use inheritance as well. But, looking at your data model, I do not think this is applicable to this particular case.
Which design is better for use?
Up to you. Whatever suits your project needs keeping down the unnecessary complexities is good for you.

get max value in java8 list using stream [duplicate]

This question already has answers here:
Java Stream: find an element with a min/max value of an attribute
(9 answers)
Closed 5 years ago.
I want to find max value in java list using java8 lambda expression,
so, I have a Class called TicketMaster and item table is TicketMasterLog ,in TicketMasterLog class I have StatusMaster Class statusId reference column, so here i want to find max statusId in TicketMasterLog List, below i'll give my code please refer
#Entity
#Table(name="ticket_master")
#NamedQuery(name="TicketMaster.findAll", query="SELECT t FROM TicketMastert")
public class TicketMaster implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Column(name="TICKET_ID", unique=true, nullable=false, length=10)
private String ticketId;
//bi-directional many-to-one association to TicketMasterLog
#OneToMany(mappedBy="ticketMaster",cascade=CascadeType.ALL)
private List<TicketMasterLog> ticketMasterLogs;
//getters and stters
}
and TicketMasterItem Table is
#Entity
#Table(name="ticket_master_log")
#NamedQuery(name="TicketMasterLog.findAll", query="SELECT t FROM TicketMasterLog t")
public class TicketMasterLog implements Serializable {
private static final long serialVersionUID = 1L;
#EmbeddedId
private TicketMasterLogPK id;
//bi-directional many-to-one association to StatusMaster
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="STATUS_ID")
private StatusMaster statusMaster;
//bi-directional many-to-one association to TicketMaster
#ManyToOne(fetch=FetchType.LAZY)
#JoinColumn(name="TICKET_ID", nullable=false, insertable=false, updatable=false)
private TicketMaster ticketMaster;
//getters and setters
}
and StatusMaster Table is
#Entity
#Table(name="status_master")
#NamedQuery(name="StatusMaster.findAll", query="SELECT s FROM StatusMaster s")
public class StatusMaster implements Serializable {
private static final long serialVersionUID = 1L;
#Id
#Column(name="STATUS_ID", unique=true, nullable=false, length=10)
private String statusId;
#Column(name="STATUS_NAME", length=45)
private String statusName;
//bi-directional many-to-one association to TicketMasterLog
#OneToMany(mappedBy="statusMaster")
private List<TicketMasterLog> ticketMasterLogs;
//getters and setters...
Now I have a TicketMasterlog List
List<TicketMasterLog> tl = //some objects;
so in that list I want find max status id value
thanking you.
You can use:
Stream<TicketMasterLog> ticketMasterLogStream = tl.stream();
TicketMasterLog max = ticketMasterLogStream.reduce((a,b)->
a.getStatusId.compareTo(b.getStatusId) > 0 ? a:b;
).get()

Mapping Extra Attribute in a Join Table JPA 2

I am trying to model this relationship following this link http://www.javaworld.com/javaworld/jw-01-2008/images/datamodel.gif
Its the usual Many to Many relationship between Order and Products but I dont know how to add the extra columns in the Join table.
#Entity
#Table(name = "Orders")
public class Order {
#ManyToMany(cascade = CascadeType.ALL)
#JoinTable(name = "ORDER_LINES", joinColumns = { #JoinColumn(name = "ORDER_ID") }, inverseJoinColumns = { #JoinColumn(name = "PROD_ID") })
private Set<Product> products;
}
#Entity
#Table(name="PRODUCTS")
public class Product {
#ManyToMany(mappedBy="products")
private Set<Order> orders;
}
How to add Join Table extra attribute in JPA 2.0?
Thanks
There is no concept of having additional persistent attribute in relation in JPA (2.0). That's why relation with property is actually intermediate entity.
From both Order and Product entities, you need one-to-many relationship to new entity. Because of bidirectional relationship, new entity will have many-to-one relationships to Order and Product.
You need to go for something like this (shows only relationships, id's and other mappings stripped away):
#Entity
#Table(name="order_item")
public class OrderItem {
#ManyToOne
private Order order;
#ManyToOne
private Product product;
}
#Entity
public class Order {
#OneToMany (mappedBy = "order")
private Set<OrderItem> orderItems;
}
#Entity
public class Product {
#OneToMany(mappedBy = "product")
private Set<OrderItem> orderItems;
}